package bll

import (
	"context"
	"github.com/LyricTian/gin-admin/v7/internal/app/model/gormx/model"

	"github.com/LyricTian/gin-admin/v7/internal/app/schema"
	"github.com/LyricTian/gin-admin/v7/pkg/errors"
	"github.com/LyricTian/gin-admin/v7/pkg/util/uuid"
	"github.com/google/wire"
)

// SetSet 注入Set
var SetSet = wire.NewSet(wire.Struct(new(Set), "*"))

// Set 系统设置
type Set struct {
	SetModel *model.Set
}

// Query 查询数据
func (a *Set) Query(ctx context.Context, params schema.SetQueryParam, opts ...schema.SetQueryOptions) (*schema.SetQueryResult, error) {
	return a.SetModel.Query(ctx, params, opts...)
}

// GetFirst 查询数据
func (a *Set) GetFirst(ctx context.Context, params schema.SetQueryParam, opts ...schema.SetQueryOptions) (*schema.Set, error) {
	item, err := a.SetModel.GetFirst(ctx, params, opts...)
	if err != nil {
		return nil, err
	}
	if item == nil {
		return nil, errors.ErrNotFound
	}

	return item, nil
}

// Get 查询指定数据
func (a *Set) Get(ctx context.Context, id string, opts ...schema.SetQueryOptions) (*schema.Set, error) {
	item, err := a.SetModel.Get(ctx, id, opts...)
	if err != nil {
		return nil, err
	} else if item == nil {
		return nil, errors.ErrNotFound
	}

	return item, nil
}

// Create 创建数据
func (a *Set) Create(ctx context.Context, item schema.Set) (*schema.IDResult, error) {

	if err := a.checkCategoryKey(ctx, item.Category, item.Key, item.Creator); err != nil {
		return nil, err
	}

	item.ID = uuid.NewID()
	err := a.SetModel.Create(ctx, item)
	if err != nil {
		return nil, err
	}

	return schema.NewIDResult(item.ID), nil
}

// Update 更新数据
func (a *Set) Update(ctx context.Context, id string, item schema.Set) error {
	oldItem, err := a.Get(ctx, id)
	if err != nil {
		return err
	}

	// 如果修改了用户的key或者category,则需要判断新改的这两个参数存不存在
	if (oldItem.Category != item.Category && item.Category != "") ||
		(oldItem.Key != item.Key && item.Key != "") {
		err := a.checkCategoryKey(ctx, item.Category, item.Key, oldItem.Creator)
		if err != nil {
			return err
		}
	}

	return a.SetModel.Update(ctx, id, item)
}

// Delete 删除数据
func (a *Set) Delete(ctx context.Context, id string) error {
	item, err := a.SetModel.Get(ctx, id)
	if err != nil {
		return err
	}
	if item == nil {
		return errors.ErrNotFound
	}

	return a.SetModel.Delete(ctx, id)
}

// UpdateStatus 更新状态
func (a *Set) UpdateStatus(ctx context.Context, id string, status int) error {
	item, err := a.SetModel.Get(ctx, id)
	if err != nil {
		return err
	}
	if item == nil {
		return errors.ErrNotFound
	}

	return a.SetModel.UpdateStatus(ctx, id, status)
}
